package cn.tedu.springboot01.controller;

import cn.tedu.springboot01.entity.User;
import cn.tedu.springboot01.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.net.URLEncoder;
import java.security.Principal;
import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {
    Logger logger = LoggerFactory.getLogger(UserController.class);
    @Autowired
    public UserService userService;

    //利用RestFul进行用户数据新增操作
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)//201,当看到响应的状态码值为201，说明数据新增成功
    public String addUser(@RequestBody User user) {
        userService.addUser(user);
        return "add ok";
    }

    //利用RestFul进行用户数据查询操作
    @GetMapping("/{id}")//响应状态码值为200
    @ResponseStatus(HttpStatus.OK)
    public User getUser(@PathVariable Integer id) {
        return userService.getById(id);
    }

    //利用RestFul进行用户数据修改操作
    @PutMapping
    @ResponseStatus(HttpStatus.NO_CONTENT)//响应状态码值为204
    public String updateUser(@RequestBody User user) {
        userService.update(user);
        return "update ok";
    }

    //利用RestFul进行用户数据删除操作
    @DeleteMapping("/{id}")
    @ResponseStatus(HttpStatus.NO_CONTENT)//响应状态码值为204
    public void deleteUser(@PathVariable Integer id) {
        userService.delete(id);
    }

    @PostMapping("/regist")
    public String regist(String username, String pwd) {
        logger.debug("注册参数：  {}， {}", username, pwd);
        userService.regist(username, pwd);
        return "注册成功！";
    }

    @PostMapping("/register")
    public String register(@RequestBody User user) {
        logger.debug("注册参数： {}", user);
        userService.regist(user.getUsername(), user.getPassword());
        return "注册成功！";
    }

    @GetMapping("/login")
    public String login(String username, String pwd) {
        logger.debug("登录凭证：{} {}", username, pwd);
        User user = userService.login(username, pwd);
        if (user != null) {
            return "登录成功！";
        } else {
            throw new UnsupportedOperationException("登录失败");
        }
    }

    /**
     * 请求路径  /users/user/2
     *
     * @param id 路径参数
     * @return
     */
    @PostMapping("/user/{id}")
    public User info(@PathVariable Integer id) {
        logger.debug("获取用户 {}", id);
        return userService.getById(id);
    }

//    @GetMapping("/{id}")
//    public User get(@PathVariable Integer id){
//        logger.debug("获取用户 {}", id);
//        return userService.getById(id);
//    }
//
//    @DeleteMapping("/{id}")
//    @ResponseStatus(HttpStatus.NOT_FOUND)
//    public void delete(@PathVariable Integer id){
//        userService.delete(id);
//    }

    @GetMapping
    public List<User> list(Principal principal) {
        //System.out.println("当前用户:"+principal.getName());
        List<User> list = userService.list();
        return list;
    }

    @GetMapping("/export")
    public ResponseEntity export() throws Exception {
        //将用户信息导出为CSV数据
        List<User> users = userService.list();
        //创建一个 StringBuilder 变量存储结果 \n表示换行
        StringBuilder buf = new StringBuilder("编号,用户名,密码,角色\n");
        //遍历 User 列表并将每条记录输出到 buf 中
        for (User user : users) {
            buf.append(user.getId()).append(",")
                    .append(user.getUsername()).append(",")
                    .append(user.getPassword()).append(",")
                    .append("\"").append(user.getRoles()).append("\"\n");
        }

        //生成响应Body数据
        //将 StringBuilder 转化为 byte[] 数组并使用 GBK 编码格式
        byte[] body = buf.toString().getBytes("GBK");
        //文件名在 HTTP 头中传输，必须进行 编码处理，避免中文字符乱码
        String filename = URLEncoder.encode("用户名单.csv", "UTF-8");
        //创建自定义响应消息，指明响应内容为 CSV 文件 设定的内容的代码大致是固定写法
        ResponseEntity responseEntity =
                //设定状态码200（ok）
                ResponseEntity.ok()
                        //设定响应体的长度，即文件的大小，以 byte 为单位
                        .contentLength(body.length)
                        //表示响应头部信息，指定响应内容类型为 text/csv，表示响应内容是一种 CSV 格式（逗号分隔值）的文本文件；
                        .header("Content-Type", "text/csv")
                        //指定了下载文件的文件名和附件形式,其中 filename 表示文件名,attachment 则表示通过下载方式获取文件
                        .header("Content-Disposition",
                                "attachment; filename=\"" + filename + "\"")
                        .body(body);//表示响应的正文内容，即文件内容
        //返回自定义响应消息
        return responseEntity;
    }

}
